#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define MAX_SIMBO 700
#define N_PAL_RESERVADAS 34
#define N_TIPOS 30
#define MAX_TAM_TIPOS 20
#define MAX_TAM_VAR 10

#define PBEGIN 1
#define CONST 2
#define ELSE 4
#define END 5
#define IF 8
#define INTEGER 9
#define PROGRAM 16
#define PROCEDURE 17
#define REAL 18
#define REPEAT 19
#define READLN 20
#define THEN 21
#define UNTIL 22
#define VAR 23
#define WHILE 24
#define WRITELN 25

#define IGUAL 116
#define DIFERENTE 117
#define MAIOR 118
#define MENOR 119
#define MAIOR_IGUAL 120
#define MENOR_IGUAL 121
#define ATRIBUICAO 122
#define PONTO_VIRGULA 123
#define DOIS_PONTOS 124
#define VIRGULA 125
#define ABRE_PARANTESES 126
#define FECHA_PARENTESES 127
#define ABRE_COMENTARIO 128
#define FECHA_COMENTARIO 129
#define SINAL_MAIS 130
#define SINAL_MENOS 131
#define SINAL_MULTI 132
#define SINAL_DIV 133
#define IDENT 136
#define COMENTARIO 137
#define PONTO 138

#define ERRO_TIPO_DADO 150
#define ERRO_IDENT_GRANDE 151
#define ERRO_IDENT_NDECL 152
#define ERRO_CADEIA_INVA 153


typedef struct simbolos{
	char *id;
	char *tipo;
	char *valor;
	//falta valor contido na variável
} simbo;

//Tabela de palavras reservadas

void inicializaPalavrasReservadas(char res[26][30]){

	strcpy(res[1], "begin");	
	strcpy(res[2], "const");
	strcpy(res[4], "else");
	strcpy(res[5], "end");
	strcpy(res[8], "if");
	strcpy(res[9], "integer");
	strcpy(res[16], "program");
	strcpy(res[17], "procedure");
	strcpy(res[18], "real");
	strcpy(res[19], "repeat");
	strcpy(res[20], "readln");
	strcpy(res[21], "then");
	strcpy(res[22], "until");
	strcpy(res[23], "var");
	strcpy(res[24], "while");	
	strcpy(res[25], "writeln");
		
	return;
}

int buscaPalavraReservada(char res[26][30], simbo fator, int *tag, int *pal_reser){

	int i = fator.id[0] - 97;
	int cod = i;

	while((i < 26) || (res[i][0] == fator.id[0])){
		if(strcmp(res[i], fator.id) == 0){
			if(i == 23 || i == 16)
				*tag = 1;
			*pal_reser = i;
			return 1;
		}
		i++;
	}
	return 0;
}

//Tabela de símbolos

int buscaElem(simbo *simb, char *ide, int n){

int i;
	for(i  = 0; i < n; i++){		
		if(strcmp(simb[i].id, ide) == 0)
				return 1;
	}
	return 0;
}

int adicionarSimb(simbo *simb, char *ide, int *numElem, int *tag){
		
	
	if((buscaElem(simb, ide, *numElem) || (*numElem) >= MAX_SIMBO) || (*tag == 0))
		return 0;

	//char *aux;
	simb[*numElem].id = (char *)malloc(sizeof(char));
	strcpy(simb[*numElem].id, ide);
	//simb[*numElem].id = aux;

	*numElem = *numElem + 1;

	*tag = 0;
	
	return 1;
}

//Tabela de tipo de dados

int buscaTipo(char tab[N_TIPOS][MAX_TAM_TIPOS], char *fator, int n){

int i;
	for(i = 0; i < n; i++){
		//if(strcmp(tab[i], fator) == 0)
		printf("\ntipo de: %s\n", tab[i]);
			return 1;
	}
	
	return 0;
}

void inicializaTipo(char tab[N_TIPOS][MAX_TAM_TIPOS]){

int i;

	strcpy(tab[0], "integer");
	strcpy(tab[1], "real");
	
}




